package com.cennavi.bigdata.baotou.listener;

import com.alibaba.fastjson.JSONObject;
import com.cennavi.bigdata.baotou.scripts.ActualTimeKakouData;
import com.cennavi.bigdata.baotou.scripts.ActualTimeRoadIndex;
import com.cennavi.bigdata.baotou.scripts.DataConversion;
import com.cennavi.bigdata.baotou.service.CrontabService;
import com.cennavi.bigdata.baotou.service.ViewService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * Created by zhouxiaolong on 2017/3/21.
 */
@Component
public class SpringTimer {

    private static final Logger LOGGER = LoggerFactory.getLogger(SpringTimer.class);

    @Autowired
    private ViewService viewService;

    @Autowired
    private CrontabService crontabService;



    @Scheduled(cron = "0 1/5 * * * ?")
    public void refrashDCIndexRT() {
        //开始执行 [行政区域指数录入] 定時任务
        new ActualTimeRoadIndex().refrashRoadIndexRT();
    }

    @Scheduled(cron = "0 3 0 15 * ?")
    public void removeDCIndexRT() {
        //开始执行 [行政区域指数删除] 定時任务
        new ActualTimeRoadIndex().removeRoadIndexRT();
    }

    @Scheduled(cron = "0 0 0/1 * * ?")
    public void refrashKakou() {
        //开始执行卡口数据定时任务
        new ActualTimeKakouData(viewService).refrashKakouData();
    }

    @Scheduled(cron = "0 0/30 * * * ?")
    public void refrashRoadIndex() {
        //定时执行向数据库插入指数、平均速度
        try {
            crontabService.insertRoadIndexTravelInfo();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Scheduled(cron = "0 0/5 * * * ?")
    public void insertTrafficFlowXJM(){
        //定时向oracle中的卡口流量分钟表插入数据
        new DataConversion().timingDataConversionMinute();
    }

    @Scheduled(cron = "0/10 0-2 * * * ?")
    //定时向oracle中的卡口流量小时表插入数据
    public void insertTrafficFlowXJH(){
        new DataConversion().timingDataConversionHour();
    }

    @Scheduled(cron = "0 1 0 3 * ?")
    //定时创建卡口流量小时月表和分钟月表
    public void insertTrafficFlow(){
        try {
            LOGGER.info(new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒").format(new Date())  + " 定时创建卡口流量小时月表和分钟月表开始");
            viewService.insertTrafficFlow();
            LOGGER.info(new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒").format(new Date())  + " 定时创建卡口流量小时月表和分钟月表完成");
        }catch (Exception e){
            e.printStackTrace();
            LOGGER.info("定时创建卡口流量小时月表和分钟月表过程中出现异常");
        }
    }

    //定时删除历史流量（分钟、小时表）
    @Scheduled(cron = "0 0 0 1 * ?")
    public void dropTrafficFlow(){
        new DataConversion().dropTable();
    }

    //对Oracle中的实时指数进行小时统计，并存入postgresql数据库
    @Scheduled(cron = "10 0 0/1 * * ?")
    public void saveHourIndexFromOracleToPg(){
        try {
            LOGGER.info(new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒").format(new Date())  + " 指数对比模块-对Oracle中的实时指数进行小时统计，并存入postgresql数据库定时任务开启了");
            //获取按天整合的数据（road、area）
            JSONObject jsonObject = viewService.getHourIndexFromOracle();
            //将整合的数据保存到pg数据库中
            LOGGER.info(new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒").format(new Date())  + " 指数对比模块-实时指数小时统计开始保存");
            crontabService.saveHourIndexFromOracleToPg(jsonObject);
            LOGGER.info(new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒").format(new Date())  + " 指数对比模块-实时指数小时统计保存成功");
        }catch (Exception e){
            e.printStackTrace();
            LOGGER.info("指数对比模块-对Oracle中的实时指数进行小时统计，并存入postgresql数据库定时任务出现异常");
         }
        }

    //对Oracle中的实时指数进行当天统计，并存入postgresql数据库
    @Scheduled(cron = "59 59 0/1 * * ?")
    public void saveIndexFromOracleToPgHour(){
        try {
            LOGGER.info(new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒").format(new Date())  + " 指数对比模块-对于当天的实时指数进行小时统计--》》》，并存入postgresql数据库定时任务开启了");
            //获取按天整合的数据（road、area）
            JSONObject jsonObject = viewService.getDayIndexFromOracle();
            //将整合的数据保存到pg数据库中
            LOGGER.info(new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒").format(new Date())  + " 指数对比模块-today--》》》实时指数小时统计开始保存");
            crontabService.saveDayIndexFromOracleToPg(jsonObject);
            LOGGER.info(new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒").format(new Date())  + " 指数对比模块-today--》》》实时指数小时统计保存成功");

        }catch (Exception e){
            e.printStackTrace();
            LOGGER.info("指数对比模块-对于当天的实时指数进行小时统计--》》》，并存入postgresql数据库定时任务出现异常");
        }
           }

    /**
     * 道路预测基础数据表
     */
    @Scheduled(cron = "0 0 4 1 * ?")
    public void saveRoad_Predict_Base(){
        try {
            LOGGER.info(new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒").format(new Date())  + " 道路预测基础数据开始整合生成");
            //获取按天整合的数据（road、area）
            //清除历史数据
            crontabService.deleteRoadPredictHis();
            viewService.saveRoadPredictBaseFromOracle();
            LOGGER.info(new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒").format(new Date())  + " 道路预测基础数据整合完成");

        }catch (Exception e){
            e.printStackTrace();
            LOGGER.info("道路预测基础数据生成过程中出现异常");
        }

    }

    /**
     * 道路预测基础数据表
     */
    @Scheduled(cron = "0 0 0 1 1/3 ?")
    public void saveQuarter (){
        try {
            LOGGER.info(new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒").format(new Date())  + " 定时插入季度数据定时任务开始执行");
            //获取按天整合的数据（road、area）
            crontabService.saveQuarter();
            LOGGER.info(new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒").format(new Date())  + " 定时插入季度数据定时任务执行完成");
        }catch (Exception e){
            e.printStackTrace();
            LOGGER.info("定时插入季度数据定时任务出现异常");
        }

    }

//    //定时删除历史的信号数据（保留两年）
//    @Scheduled(cron = "0 0 0 * * ?")
//    public void deleteHistoryInfo(){
//        crontabService.deleteHistoryInfo();
//    }

}